#!/usr/bin/env python3
"""
命令行文本计数统计程序
支持统计字符数、单词数、句子数，以及代码文件分析
"""

import sys
import os
import re


def count_characters(text):
    """统计字符数（包括空格和标点）"""
    return len(text)


def count_words(text):
    """统计单词数"""
    # 使用正则表达式匹配单词（字母数字序列）
    words = re.findall(r'\b[a-zA-Z]+\b', text)
    return len(words)


def count_sentences(text):
    """统计句子数"""
    # 简单的句子分割：以 . ! ? 结尾作为句子
    sentences = re.split(r'[.!?]+', text)
    # 过滤空字符串
    sentences = [s.strip() for s in sentences if s.strip()]
    return len(sentences)


def count_code_lines(text, file_extension):
    """
    统计代码行、空行、注释行
    支持 Python, C/C++, Java, JavaScript, C# 等常见语言
    """
    lines = text.split('\n')

    total_lines = len(lines)
    empty_lines = 0
    comment_lines = 0
    code_lines = 0

    # 根据文件扩展名确定注释风格
    if file_extension in ['.py']:
        # Python: # 单行注释, ''' 或 """ 多行注释
        in_multiline_comment = False
        for line in lines:
            stripped_line = line.strip()

            if in_multiline_comment:
                comment_lines += 1
                if stripped_line.endswith("'''") or stripped_line.endswith('"""'):
                    in_multiline_comment = False
            elif stripped_line.startswith("'''") or stripped_line.startswith('"""'):
                comment_lines += 1
                in_multiline_comment = not (stripped_line.endswith("'''") or stripped_line.endswith('"""'))
            elif stripped_line.startswith('#'):
                comment_lines += 1  # 纯注释行
            elif stripped_line == '':
                empty_lines += 1    # 空行
            else:
                code_lines += 1     # 代码行
                # 检查是否有行内注释
                if '#' in line:
                    comment_lines += 1  # 行内注释

    elif file_extension in ['.c', '.cpp', '.h', '.hpp', '.java', '.js', '.cs']:
        # C风格: // 单行注释, /* */ 多行注释
        in_multiline_comment = False
        for line in lines:
            stripped_line = line.strip()

            if in_multiline_comment:
                comment_lines += 1
                if '*/' in stripped_line:
                    in_multiline_comment = False
            elif stripped_line.startswith('//'):
                comment_lines += 1  # 纯注释行
            elif stripped_line.startswith('/*'):
                comment_lines += 1
                if not '*/' in stripped_line:
                    in_multiline_comment = True
            elif stripped_line == '':
                empty_lines += 1    # 空行
            else:
                code_lines += 1     # 代码行
                # 检查是否有行内注释
                if '//' in line:
                    comment_lines += 1  # 行内注释

    else:
        # 默认处理：简单的空行和注释检测
        for line in lines:
            stripped_line = line.strip()
            if stripped_line == '':
                empty_lines += 1
            elif stripped_line.startswith('#') or stripped_line.startswith('//'):
                comment_lines += 1
            else:
                code_lines += 1

    return {
        'total_lines': total_lines,
        'code_lines': code_lines,
        'comment_lines': comment_lines,
        'empty_lines': empty_lines
    }


def read_file(file_path):
    """读取文件内容"""
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            return file.read()
    except FileNotFoundError:
        print(f"错误：文件 '{file_path}' 未找到")
        return None
    except Exception as e:
        print(f"读取文件时出错：{e}")
        return None


def get_file_extension(file_path):
    """获取文件扩展名"""
    _, ext = os.path.splitext(file_path)
    return ext.lower()


def print_usage():
    """打印使用说明"""
    print("用法: wc.exe [参数] [文件名]")
    print("基础文本统计参数:")
    print("  -c  统计字符数")
    print("  -w  统计单词数")
    print("  -s  统计句子数")
    print("  -a  统计所有文本信息")
    print("代码分析参数:")
    print("  -cl 统计代码行数（总行数、代码行、注释行、空行）")
    print("  -l  统计总行数")
    print("  -com 统计注释行数")
    print("  -empty 统计空行数")
    print("支持的文件类型:")
    print("  文本文件: .txt")
    print("  Python: .py")
    print("  C/C++: .c, .cpp, .h, .hpp")
    print("  Java: .java")
    print("  JavaScript: .js")
    print("  C#: .cs")
    print("示例:")
    print("  wc.exe -c file.txt")
    print("  wc.exe -cl program.py")
    print("  wc.exe -a file.txt")


def main():
    if len(sys.argv) != 3:
        print_usage()
        sys.exit(1)

    param = sys.argv[1]
    file_path = sys.argv[2]

    # 检查文件是否存在
    if not os.path.exists(file_path):
        print(f"错误：文件 '{file_path}' 不存在")
        sys.exit(1)

    # 读取文件内容
    text = read_file(file_path)
    if text is None:
        sys.exit(1)

    # 获取文件扩展名
    file_extension = get_file_extension(file_path)

    # 根据参数执行相应操作
    if param == '-c':
        char_count = count_characters(text)
        print(f"字符数: {char_count}")

    elif param == '-w':
        word_count = count_words(text)
        print(f"单词数: {word_count}")

    elif param == '-s':
        sentence_count = count_sentences(text)
        print(f"句子数: {sentence_count}")

    elif param == '-a':
        char_count = count_characters(text)
        word_count = count_words(text)
        sentence_count = count_sentences(text)

        print(f"字符数: {char_count}")
        print(f"单词数: {word_count}")
        print(f"句子数: {sentence_count}")

    elif param == '-cl':  # 代码行统计
        code_stats = count_code_lines(text, file_extension)
        print(f"文件: {file_path}")
        print(f"总行数: {code_stats['total_lines']}")
        print(f"代码行: {code_stats['code_lines']}")
        print(f"注释行: {code_stats['comment_lines']}")
        print(f"空行: {code_stats['empty_lines']}")

    elif param == '-l':  # 总行数
        code_stats = count_code_lines(text, file_extension)
        print(f"总行数: {code_stats['total_lines']}")

    elif param == '-com':  # 注释行
        code_stats = count_code_lines(text, file_extension)
        print(f"注释行: {code_stats['comment_lines']}")

    elif param == '-empty':  # 空行
        code_stats = count_code_lines(text, file_extension)
        print(f"空行: {code_stats['empty_lines']}")

    else:
        print(f"错误：未知参数 '{param}'")
        print_usage()
        sys.exit(1)


if __name__ == "__main__":
    main()